From: Roan Kattouw Date: Mon, 14 Feb 2011 19:55:20 +0000 (+0000) Subject: (bug 27402) Add support for disabling MWSuggest X-Git-Tag: 1.31.0-rc.0~31991 X-Git-Url: http://git.cyclocoop.org/%7D%7Cconcat%7B?a=commitdiff_plain;h=266a53af6e06063eb1a7e1142a937a872380f797;p=lhc%2Fweb%2Fwiklou.git (bug 27402) Add support for disabling MWSuggest --- diff --git a/skins/common/mwsuggest.js b/skins/common/mwsuggest.js index 134b2d8ab0..6971d30df1 100644 --- a/skins/common/mwsuggest.js +++ b/skins/common/mwsuggest.js @@ -46,6 +46,9 @@ window.os_animation_delay = 30; window.os_container_max_width = 2; // currently active animation timer window.os_animation_timer = null; +// whether MWSuggest is enabled. Set to false when os_MWSuggestDisable() is called +window.os_enabled = true; + /** * is a new HTML5 element that allows you to manually supply * suggestion lists and have them rendered according to the right platform @@ -107,7 +110,11 @@ window.os_AnimationTimer = function( r, target ) { /** Initialization, call upon page onload */ window.os_MWSuggestInit = function() { - for( i = 0; i < os_autoload_inputs.length; i++ ) { + if ( !window.os_enabled ) { + return; + } + + for( var i = 0; i < os_autoload_inputs.length; i++ ) { var id = os_autoload_inputs[i]; var form = os_autoload_forms[i]; element = document.getElementById( id ); @@ -117,6 +124,25 @@ window.os_MWSuggestInit = function() { } }; +/* Teardown, called when things like SimpleSearch need to disable MWSuggest */ +window.os_MWSuggestTeardown = function() { + for( var i = 0; i < os_autoload_inputs.length; i++ ) { + var id = os_autoload_inputs[i]; + var form = os_autoload_forms[i]; + element = document.getElementById( id ); + if( element != null ) { + os_teardownHandlers( id, form, element ); + } + } +}; + +/* Call this to disable MWSuggest. Works regardless of whether MWSuggest has been initialized already. */ +window.os_MWSuggestDisable = function() { + window.os_MWSuggestTeardown(); + window.os_enabled = false; +} + + /** Init Result objects and event handlers */ window.os_initHandlers = function( name, formname, element ) { var r = new os_Results( name, formname ); @@ -126,20 +152,20 @@ window.os_initHandlers = function( name, formname, element ) { return; } // event handler - os_hookEvent( element, 'keyup', function( event ) { os_eventKeyup( event ); } ); - os_hookEvent( element, 'keydown', function( event ) { os_eventKeydown( event ); } ); - os_hookEvent( element, 'keypress', function( event ) { os_eventKeypress( event ); } ); + os_hookEvent( element, 'keyup', os_eventKeyup ); + os_hookEvent( element, 'keydown', os_eventKeydown ); + os_hookEvent( element, 'keypress', os_eventKeypress ); if ( !os_use_datalist ) { // These are needed for the div hack to hide it if the user blurs. - os_hookEvent( element, 'blur', function( event ) { os_eventBlur( event ); } ); - os_hookEvent( element, 'focus', function( event ) { os_eventFocus( event ); } ); + os_hookEvent( element, 'blur', os_eventBlur ); + os_hookEvent( element, 'focus', os_eventFocus ); // We don't want browser auto-suggestions interfering with our div, but // autocomplete must be on for datalist to work (at least in Opera // 10.10). element.setAttribute( 'autocomplete', 'off' ); } // stopping handler - os_hookEvent( formElement, 'submit', function( event ) { return os_eventOnsubmit( event ); } ); + os_hookEvent( formElement, 'submit', os_eventOnsubmit ); os_map[name] = r; // toggle link if( document.getElementById( r.toggle ) == null ) { @@ -167,6 +193,30 @@ window.os_initHandlers = function( name, formname, element ) { }; +window.os_teardownHandlers = function( name, formname, element ) { + var formElement = document.getElementById( formname ); + if( !formElement ) { + // Older browsers (Opera 8) cannot get form elements + return; + } + + os_unhookEvent( element, 'keyup', os_eventKeyup ); + os_unhookEvent( element, 'keydown', os_eventKeydown ); + os_unhookEvent( element, 'keypress', os_eventKeypress ); + if ( !os_use_datalist ) { + // These are needed for the div hack to hide it if the user blurs. + os_unhookEvent( element, 'blur', os_eventBlur ); + os_unhookEvent( element, 'focus', os_eventFocus ); + // We don't want browser auto-suggestions interfering with our div, but + // autocomplete must be on for datalist to work (at least in Opera + // 10.10). + element.removeAttribute( 'autocomplete' ); + } + // stopping handler + os_unhookEvent( formElement, 'submit', os_eventOnsubmit ); +}; + + window.os_hookEvent = function( element, hookName, hookFunct ) { if ( element.addEventListener ) { element.addEventListener( hookName, hookFunct, false ); @@ -175,6 +225,14 @@ window.os_hookEvent = function( element, hookName, hookFunct ) { } }; +window.os_unhookEvent = function( element, hookName, hookFunct ) { + if ( element.removeEventListener ) { + element.removeEventListener( hookName, hookFunct, false ); + } else if ( element.detachEvent ) { + element.detachEvent( 'on' + hookName, hookFunct ); + } +} + /******************** * Keyboard events ********************/